from flask import request, jsonify
from aps import app

from aps.models.rol import *
from aps.models.usuario import *
from aps.models.fase import *
from aps.models.faserol import *
from aps.models.proyectorol import *
from aps.models.rolpermiso import *
from aps.models.proyecto import *

@app.route('/crear_rol', methods=['GET', 'POST']) 
def crear_rol():
    """
    Nos permite traer los parametros que fueron cargados por el usuario
    y guardarlos en la base de datos.
    @param request: objeto que encapsula la peticion del cliente
    @return: True si la accion se realizo correctamente
    """
    id_proyecto   = request.form['idproyecto']
    nombre        = request.form['nombre']
    descripcion   = request.form['descripcion']
    
    # Guardamos en la BD
    model         = Rol(nombre, descripcion)
    bdsession.add(model)
    bdsession.flush()
    
    # Relacionamos el rol con el proyecto
    id_rol        = model.id
    model         = ProyectoRol(id_proyecto,id_rol)
    bdsession.add(model)
    
    # Habilitamos el rol en todas las fases
    proyecto = bdsession.query(Proyecto).filter_by(id=id_proyecto).first()
    for pf in proyecto.fases:
        model2 = FaseRol(pf.fase.id,id_rol)
        bdsession.add(model2)

    return jsonify ({'success' : True})

@app.route('/modificar_rol', methods=['GET', 'POST']) 
def modificar_rol():
    """
    Nos permite traer los parametros que fueron modificados por el usuario
    y guardar los cambios en la base de datos.
    @param request: objeto que encapsula la peticion del cliente
    @return: True si la accion se realizo correctamente
    """ 
    id            = request.form['id']
    nombre        = request.form['nombre']
    descripcion   = request.form['descripcion']   
    # se modifica en la BD
    model         = Rol(nombre, descripcion)
    model.id      = id
    bdsession.merge(model)   
    return jsonify ({'success' : True})

@app.route('/consultar_rol', methods=['GET', 'POST']) 
def consultar_rol():
    """
    Nos permite traer los parametros de consulta(el filtro y el valor) y mostrar
    los roles que cumplen con la condicion del filtro.
    @param request: objeto que encapsula la peticion del cliente
    @return: si la accion se realizo correctamente
    """
    print "sdhgfjdshgfjdgsf"
    id_proyecto = request.args['idproyecto']
    print id_proyecto
    print 'hola'
    # Obtenemos los roles que pertenecen al proyecto
    roles = bdsession.query(ProyectoRol).filter_by(idproyecto=id_proyecto).all()
    if request.args.has_key('filtro'):
        filtro = request.args['filtro']
        valor  = request.args['valor']
        # Realizamos un filtro, si se necesita
        roles  = [ r for r in roles if str(r.rol.__dict__[filtro]) == str(valor) ]
    # Obtenemos los roles a procesar
    roles = [ r.rol for r in roles if r.rol.id > 3]
    # Procesamos los roles
    data = []
    for rol in roles:
        item = {}
        item['id'] = rol.id
        item['nombre'] = rol.nombre
        item['descripcion'] = rol.descripcion
        data.append(item)
    return jsonify ({'success':True, 'data':data, 'total':len(data)})

@app.route('/eliminar_rol', methods=['GET', 'POST']) 
def eliminar_rol():
    """
    Nos permite traer el id del rol a eliminar, eliminar las dependendcias
    del mismo con respecto a otras tablas y eliminar el registro de la base de datos.
    @param request: objeto que encapsula la peticion del cliente
    @return: True si la accion se realizo correctamente y False en caso contrario
    """ 
    id_rol  = request.form['idrol']
    rol     = bdsession.query(Rol).filter_by(id=id_rol).first()
    # Verificamos que no este asociado a un usuario o a una fase
    if len(rol.fases) != 0 or len(rol.usuarios_x_proyecto) != 0:
        return jsonify ({'success':False})
    # Eliminamos las relaciones con los permisos y proyecto
    bdsession.query(RolPermiso).filter_by(idrol=id_rol).delete(synchronize_session=False)
    bdsession.query(ProyectoRol).filter_by(idrol=id_rol).delete(synchronize_session=False)
    # Eliminamos el rol
    bdsession.delete(rol)
    return jsonify ({'success' : True})

@app.route('/consulta_asignar_roles', methods=['GET', 'POST']) 
def consulta_asignar_roles():
    """
    Nos permite traer todos los roles asignados y asignables a una fase
    @param request: objeto que encapsula la peticion del cliente
    @return: True si la accion se realizo correctamente, la lista de roles asignados al usuario y la lista de roles asignables al usuario
    """
    def process_rol_list(list):
        """
        Serializa una lista de con los datos de los roles para enviarla al cliente
        @param list: lista de objectos Permiso obtenidas desde la BD
        @return: result lista procesada de roles
        """
        result = []
        for rol in list:
            if rol.id > 3:
                item = [None,None,None,None]
                item[0] = rol.id
                item[1] = rol.nombre
                item[2] = rol.descripcion
                result.append(item)
        return result
    
    id_fase  = request.form['idfase']
    # Obtenemos los roles disponibles en el proyecto
    roles    = bdsession.query(Fase).filter_by(id=id_fase).first().proyectos[0].proyecto.roles
    # Obtenemos la lista de roles que fueron asignados a la fase
    roles_asignados = [ x.rol for x in bdsession.query(Fase).filter_by(id=id_fase).first().roles ]
    ids_asignados   = [ x.id for x in roles_asignados ]
    # Obtenemos la lista de roles que no fueron asignados a la fase
    roles_asignables = [ x.rol for x in roles if x.rol.id not in ids_asignados ]
    # Procesamos los roles para enviar al cliente
    asignados  = process_rol_list(roles_asignados)
    asignables = process_rol_list(roles_asignables)
    return jsonify ({'success':True, 'asignados':asignados, 'asignables':asignables})

@app.route('/asignar_desasignar_rol', methods=['GET', 'POST']) 
def asignar_desasignar_rol():
    """
    Nos permite asignar/desasignar roles a una fase
    @param request: objeto que encapsula la peticion del cliente
    @return: True si la accion se realizo correctamente
    """
    received = eval(request.form['data'])
    # id de la fase a asignar/desasignar roles
    id_fase  = received['idfase']
    # ids de roles asignados
    data = received['data']
    # obtenemos la fase desde la BD
    fase = bdsession.query(Fase).filter_by(id=id_fase).first()
    # eliminamos sus roles asignados anteriormente
    bdsession.query(FaseRol).filter_by(idfase=id_fase).delete()
    # actualizamos la fase
   # bdsession.refresh(fase)
    # creamos una nueva lista de roles asignados
    for id_rol in data:
        fase.roles.append(FaseRol(id_fase,id_rol))
    # asignamos el rol de lider
    fase.roles.append(FaseRol(id_fase,2))
    bdsession.refresh(fase)
    # guardamos los cambios
    #bdsession.merge(fase)
    return jsonify ({'success':True})